package swingxrcp.framework.server.environment;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import swingxrcp.framework.model.environment.MessageSource;
import swingxrcp.framework.model.environment.Version;
import swingxrcp.framework.util.ConfigUtils;

/**
 * 应用信息
 *
 * @author liangfei
 *
 */
public class Application {

	public Application(Properties properties,
			Map<String, Properties> modulesProperties) {
		this.configuration = properties;
		this.name = properties.getProperty("application.name");
		String versionType = properties.getProperty("version.type");
		String versionNumber = properties.getProperty("version.number");
		String releaseDate = properties.getProperty("release.date");
		this.version = new Version(versionNumber, versionType, releaseDate);
		Collection<String> actionModules = ConfigUtils.split(properties.getProperty("action.modules"));
		this.modules = convertModule(modulesProperties, actionModules);
		this.messageSource = null; // TODO 国际化信息加载待考虑
	}

	private static Map<String, Module> convertModule(Map<String, Properties> moduleProperties, Collection<String> actionModules) {
		Map<String, Module> modules = new HashMap<String, Module>();
		for (Map.Entry<String, Properties> entry : moduleProperties.entrySet()) {
			String name = entry.getKey();
			Properties properties = entry.getValue();
			Module module = new Module(name, properties, actionModules.contains(name));
			modules.put(name, module);
		}
		return Collections.unmodifiableMap(modules);
	}

	private String name;

	/**
	 * 获取当前应用的名称
	 *
	 * @return 名称
	 */
	public String getName() {
		return name;
	}

	private Version version;

	/**
	 * 获取当前应用的版本
	 *
	 * @return 版本
	 */
	public Version getVersion() {
		return version;
	}

	/**
	 * 获取所有模块的修改日志
	 *
	 * @return 所有模块的修改日志
	 */
	public String getChangeLog() {
		StringBuilder buf = new StringBuilder();
		Collection<Module> modules = getModules();
		for (Module module: modules) {
			buf.append("MODULE:");
			buf.append(module.getName());
			buf.append("\n");
			buf.append(module.getChangeLog());
			buf.append("\n");
		}
		return buf.toString();
	}

	private Properties configuration;

	/**
	 * 获取当前应用的全局配置信息
	 *
	 * @return 当前应用的全局配置信息
	 */
	public Properties getConfiguration() {
		return configuration;
	}

	private MessageSource messageSource;

	/**
	 * 获取当前应用的全局国际化信息源
	 *
	 * @return 当前应用的全局国际化信息源
	 */
	public MessageSource getMessageSource() {
		return messageSource;
	}

	private Map<String, Module> modules;

	/**
	 * 通过模块名查找模块信息
	 *
	 * @param name 模块名
	 * @return 模块信息
	 */
	public Module getModule(String name) {
		return modules.get(name);
	}

	/**
	 * 获取当前应用中的所有模块
	 *
	 * @return 当前应用中的所有模块
	 */
	public Collection<Module> getModules() {
		return modules.values();
	}

	/**
	 * 通过包名查找模块信息
	 *
	 * @param packageName 包名
	 * @return 模块信息
	 */
	public Module findModuleByPackage(String packageName) {
		return modules.get(name);
	}

}
